package cn.bonoon.kernel.annotations.condition;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import cn.bonoon.kernel.annotations.QueryJoin;

/**
 * <pre>
 * 把属性定义成可以解析成查询条件。如:userName等。
 * 
 * 支持对-对多或多对多的查询方式，可以使用以下的定义方式：
 * 1.[id或[user.id；这种方式是以当前属性名为对应的
 *   需要被查询的集合的名称，对集合里的字段进行条件查询。
 * 2.roles[id或roles[user.id
 * 
 * 关于生成查询条件；
 * 新的版本使用属性命名表达式，如：
 * searchStartAt->解析的时候将先去掉search，然后再判断是否以某些关键词形状，
 *     如：start,end,gt,ge等，并且后面定义为字段名，如果是At将自动转为createAt
 * 按照规则，上面例子相等的表达式为：
 * searchStartAt = searchStartCreateAt = startAt = startCreateAt
 * 
 * 注意：
 * 1.如果使用本注解，则不会对前缀进行解析，但可以解析规则
 * 2.果指定了{@link ConditionOpt}，则不会对规则进行解析，但可以解析前缀
 * 3.组合有效
 * 
 * 特殊情况：
 * 如果刚好数据库实体定义字段名叫：searchStartAt、searchStartCreateAt、startAt、startCreateAt
 * 可以使用本解析与{@link ConditionOpt}组合，将不会对定义的字段进行解析
 * 
 * 如果需要与其它条件进行条件比较的，需要使用注解{@link ConditionWith @ConditionWith}
 * </pre>
 * @author jackson
 *
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface ConditionField {
	
	/**
	 * <pre>
	 * 使用join连接进行查询；允许定义多级的join查询，如：
	 * from user x left join x.roles y left join y.actions z
	 * </pre>
	 * @return
	 * @see QueryJoin
	 */
	QueryJoin[] joins() default {};
	/**
	 * propertyName
	 * @return
	 */
	String value();
}
